package com.samba.beans;


import java.util.Collection;
import java.util.Date;
import javax.ejb.Local;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.samba.entites.Category;
import com.samba.entites.CreditProjetUtilisateur;
import com.samba.entites.Entrepreneur;
import com.samba.entites.Gestionnaire;
import com.samba.entites.Preteur;
import com.samba.entites.Projet;
import com.samba.entites.Type;
import com.samba.entites.Utilisateur;
import com.samba.sessions.AdminServiceDAO;

@Stateless
@Local( { AdminServiceDAO.class })
public class AdminServiceBean implements AdminServiceDAO {
	
	@PersistenceContext(unitName = "GestionMicroCredit")
	private EntityManager GestionMicroCreditEM;

	//***************************************
	//*********** CRUD Methods **************
	//***************************************
	//************ User *********************
	//***************************************
	public Utilisateur addGestionnaire(Utilisateur gestionnaire) {
		GestionMicroCreditEM.persist(gestionnaire);
		return gestionnaire;
	}
	
	public Utilisateur updateGestionnaire(Utilisateur gestionnaire) {
		GestionMicroCreditEM.merge(gestionnaire);
		return gestionnaire;
	}
	
	public void deleteGestionnaire(int id) {
		GestionMicroCreditEM.remove(findUtilisateurById(id));
	}
	

	public Collection<Utilisateur> findAllUtilisateurs() {
		Query query = GestionMicroCreditEM.createQuery(
				"SELECT user FROM Utilisateur AS user");
		return query.getResultList();
	}

	public Collection<Gestionnaire> findAllGestionnaire() {
		Query query = GestionMicroCreditEM.createQuery(
				"");
		return query.getResultList();
	}
	
	public Collection<Preteur> findAllPreteur() {
		Query query = GestionMicroCreditEM.createQuery(
				"");
		return query.getResultList();
	}
	
	public Collection<Entrepreneur> findAllEntrepeneur() {
		Query query = GestionMicroCreditEM.createQuery(
				"");
		return query.getResultList();
	}
	
	
	public Utilisateur  findUtilisateurById(Integer id) {
		return GestionMicroCreditEM.find(Utilisateur.class, id);
	}

	//***************************************
	//*********** CRUD Methods ************** 
	//***************************************
	//************ Type *********************
	//***************************************
		
	public Type addType(Type type){
		GestionMicroCreditEM.persist(type);
		return type;
	}
	
	public void deleteType(int id) {
		GestionMicroCreditEM.remove(findTypeById(id));
	}
	
	public Type updateType(Type type) {
		GestionMicroCreditEM.merge(type);
		return type;
	}
	
	public Collection<Type> findAllTypes() {
		Query query = GestionMicroCreditEM.createQuery(
		"SELECT type From Type As type"); 
		return query.getResultList();
	}
        
        public Type findTypeById(Integer id) {
            return GestionMicroCreditEM.find(Type.class,id);
        }
	
	//***************************************
	//*********** CRUD Methods **************
	//***************************************
	//************ Category *****************
	//***************************************
	
	public Category addCategory(Category category) {
		GestionMicroCreditEM.persist(category);
		return category;
	}

	public Category updateCategory(Category category) {
		GestionMicroCreditEM.merge(category);
		return category;
	}

	public void deleteCategory(int id ) {
		GestionMicroCreditEM.remove(findCategoryById(id));
	}
	
	public Collection<Category> findAllCategories() {
		Query query = GestionMicroCreditEM.createQuery(
		"SELECT category From Category As category");
		return query.getResultList();
	}
	
        public Category findCategoryById(Integer id) {
            return GestionMicroCreditEM.find(Category.class,id);
        }   


	//***************************************
	//*********** CRUD Methods **************
	//***************************************
	//************ Projet ****************
	//***************************************

	public Projet addProjet(Projet projet) {
		projet.setDateDePublication((new Date()));
		GestionMicroCreditEM.persist(projet);
		return projet;
	}

	public void deleteProjet(int id) {
            GestionMicroCreditEM.remove(findProjetById(id));
        }
        
        public Projet updateProjet(Projet projet) {
        	Projet localRes = findProjetById(projet.getId());
                localRes.setActive(projet.getActive());
                localRes.setAuteur(projet.getAuteur());
                
                localRes.getPreteurs().clear();
                localRes.getPreteurs().addAll(projet.getPreteurs());
                
           
                localRes.setDefaultDurePret(projet.getDefaultDurePret());
                localRes.setDetails(projet.getDetails());

                if(projet.getLogo() != null)
                    if(projet.getLogo().length > 0)
                        localRes.setLogo(projet.getLogo());
                    else 
                        localRes.setLogo(null);

                localRes.setTiltle(projet.getTiltle());
                localRes.setTypeFk(projet.getTypeFk());
                localRes.setValid(projet.isValid());
                return localRes;
	}

        public Collection<Projet> findAllProjets() {
            return GestionMicroCreditEM.createNamedQuery("findAllProjets").getResultList();
        }
        
	
	public Projet findProjetById(Integer id) {
		return GestionMicroCreditEM.find(Projet.class, id);
	}

	//***************************************
	//*********** CRUD Methods **************
	//***************************************
	//************ CreditProjetUtilisateur ************
	//***************************************
	
	public CreditProjetUtilisateur addCredit(CreditProjetUtilisateur credit) {
		GestionMicroCreditEM.persist(credit);
		return credit;
	}

        public CreditProjetUtilisateur updateCredit(CreditProjetUtilisateur credit) {
            GestionMicroCreditEM.merge(credit);
            return credit;
        }

        public void deleteCredit(int id ) {
            GestionMicroCreditEM.remove(findCreditById(id));
        }

		
		public CreditProjetUtilisateur findCreditById(Integer id) {
			return GestionMicroCreditEM.find(CreditProjetUtilisateur.class,id);
		}

	
		public Collection<CreditProjetUtilisateur> findAllCredit() {
			  return GestionMicroCreditEM.createNamedQuery("findAllCreditProjet").getResultList();
		}

	
}